#pragma once

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QCheckBox>  // 新增：调试复选框
#include <QtWidgets/QPushButton> // 新增：按钮
#include <QtWidgets/QLabel> // 新增：标签
#include <QtWidgets/QFrame> // 新增：框架
#include <QtWidgets/QHBoxLayout> // 新增：水平布局
#include <QtWidgets/QVBoxLayout> // 新增：垂直布局
#include <QtWidgets/QMessageBox> // 新增：消息框
#include <QUdpSocket>
#include <QHostAddress>
#include <QDateTime>
#include <QDataStream>
#include <QRandomGenerator>
#include <QTimer>
#include <QMutex>
#include <QPropertyAnimation> // 新增：属性动画
#include <memory>

// 包含拆分出的文件
#include "GameEnums.h"
#include "GameData.h"
#include "GamePacket.h"

class QClient : public QMainWindow
{
    Q_OBJECT

public:
    QClient(QWidget *parent = nullptr);
    ~QClient() override;
    
protected:
    bool eventFilter(QObject* obj, QEvent* event) override;
    void closeEvent(QCloseEvent* event) override;

public slots:
    void SendCommandEvent();
    void onDataReceived();

private slots:
    void processReceivedPacket(const QByteArray& data);
    void onDebugModeChanged(bool enabled);  // 新增：调试模式切换槽
    void toggleDebugArea();                 // 新增：调试区域折叠切换槽

private:
    // UI组件
    QTextEdit* m_messageBox;
    QLineEdit* m_commandInput;
    QCheckBox* m_debugCheckBox;  // 新增：调试模式复选框
    
    // 可折叠调试区域
    QFrame* m_debugFrame;         // 调试区域框架
    QPushButton* m_collapseButton; // 折叠/展开按钮
    bool m_debugAreaCollapsed;    // 调试区域是否折叠
    QPropertyAnimation* m_collapseAnimation; // 折叠动画
    
    // 新增：战斗面板UI组件
    QPushButton* m_startButton;     // 开始游戏按钮
    QPushButton* m_attackButton;    // 攻击按钮
    QPushButton* m_statusButton;    // 状态按钮
    QPushButton* m_helpButton;      // 帮助按钮
    
    // 状态显示组件
    QLabel* m_playerStatusLabel;    // 玩家状态显示
    QLabel* m_gameProgressLabel;    // 游戏进度显示
    QLabel* m_connectionLabel;      // 连接状态显示
    
    // 网络组件
    QUdpSocket* m_socket;
    
    // 连接信息
    quint16 m_serverPort;
    ConnectionState m_connectionState;
    int m_reconnectAttempts;  // 重连尝试次数
    
    // 游戏数据
    quint32 m_playerId;
    PlayerGameData m_playerData;
    MonsterData m_monsterData;
    QMutex m_playerDataMutex;  // 玩家数据保护互斥锁
    QDateTime m_lastStatusCheck; // 上次状态查询时间（防止频繁查询）
    
    // 长按重新开始相关
    QTimer* m_longPressTimer;    // 长按计时器
    QTimer* m_progressTimer;     // 进度更新计时器
    QTimer* m_reverseTimer;      // 反向恢复计时器
    int m_longPressProgress;     // 长按进度 (0-100)
    bool m_isLongPressing;       // 是否正在长按
    bool m_isReverseAnimating;   // 是否正在反向动画
    
    // 超时保护计时器
    QTimer* m_timeoutTimer;      // 操作超时保护计时器
    
    // 请求状态跟踪（防止重复请求和流程错乱）
    bool m_isStartRequestPending;   // 是否有开始游戏请求等待响应
    bool m_isAttackRequestPending;  // 是否有攻击请求等待响应
    QDateTime m_lastStartRequest;   // 上次开始游戏请求时间
    QDateTime m_lastAttackRequest;  // 上次攻击请求时间
    
    // 调试开关
    bool m_debugMode;  // 新增：调试模式开关

    // UI相关
    void setupUI();
    void loadStyleSheet();
    void addSystemMessage(const QString& message);
    void addGameMessage(const QString& message);
    void addCombatMessage(const QString& message);  // 新增：战斗消息
    void addDebugMessage(const QString& message);   // 新增：调试消息
    void updateWindowTitle();
    void clearCommandInput();
    void updatePlayerStatus();     // 新增：更新玩家状态显示（调用者需持有m_playerDataMutex锁）
    void updateGameProgress();     // 新增：更新游戏进度显示（调用者需持有m_playerDataMutex锁）
    void updateConnectionStatus(); // 新增：更新连接状态显示（不需要锁）
    void updateButtonStates();     // 新增：更新按钮状态（调用者需持有m_playerDataMutex锁）
    void resetButtonsOnTimeout();  // 新增：超时时重置按钮状态
    
    // 长按重新开始相关
    void startLongPress();         // 开始长按检测
    void cancelLongPress();        // 取消长按
    void updateLongPressProgress(); // 更新长按进度
    void updateReverseProgress();  // 更新反向恢复进度
    void executeLongPressAction(); // 执行长按动作
    
    // 网络相关
    void initializeNetwork();
    void connectToServer();
    void disconnectFromServer();
    void sendPacket(std::shared_ptr<GamePacket> packet);
    
    // 指令处理
    void processCommand(const QString& command);
    void handleAttackCommand();
    void handleStatusCommand();
    void handleHelpCommand();
    void handleStartCommand();
    
    // 数据包处理
    void handlePlayerJoinResponse(std::unique_ptr<GamePacket>& packet);
    void handleGameStatus(std::unique_ptr<GamePacket>& packet);
    void handleAttackResult(std::unique_ptr<GamePacket>& packet);
    void handleLevelUp(std::unique_ptr<GamePacket>& packet);
    void handleCombatMessage(std::unique_ptr<GamePacket>& packet);  // 新增：处理战斗消息
    
    // 游戏状态显示
    QString displayPlayerStats() const;
    QString displayMonsterInfo() const;
    void displayGameHelp();
};

